package co.edu.uniquindio.ondas.daos;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionAsesorDTO;
import co.edu.uniquindio.ondas.entidades.Asesor;
/**
 * @version 1.0
 * @author Javier
 * 
 * Session Bean implementation class AsesorDAO
 * 
 * @param Asesor hace referencia a la entidad que va hacer manejada por el DAO.
 * @param String especifica cual es el tipo de dato de la llave primaria de la entidad. 
 */
public class AsesorDAO extends DAO<Asesor, String> {

	/**
	 * Manejador de Persistencia
	 */
	private EntityManager entityManager;

	/**
	 * Metodo constructor 
	 *@param entityManager
	 */
	public AsesorDAO(EntityManager entityManager) {
		super(entityManager);
		this.entityManager = entityManager;
		// TODO Auto-generated constructor stub
	}

	
	@Override
	protected Class<Asesor> getEntityClass() {
		
		return Asesor.class;
	}

	/**
	 * Metodo que permite consultar un Asesor dada su Identificacion
	 * @param id
	 * @return Asesor
	 */
	public Asesor getAsesor(String id) {
		Query query = entityManager
				.createQuery("SELECT a from Asesor a WHERE a.identificacion=:parametro");
		query.setParameter("parametro", id);

		return (Asesor) query.getSingleResult();
	}

	/**
	 * Metodo que permite devuelve una lista de los Asesores registrados en el sistema
	 * @return Lista de Asesores
	 */
	@SuppressWarnings("unchecked")
	public List<Asesor> getListaAsesores() {
		Query query = entityManager
				.createQuery("SELECT a from Asesor a ORDER BY a.nombre");

		return query.getResultList();
	}

	/**
	 * Metodo que permite obtener por consulta el resumen de una investigacion dado el identificador de un Asesor
	 * @param idAsesor
	 * @return Lista de Investigaciones por Asesor
	 */
	@SuppressWarnings("unchecked")
	public List<ResumenInvestigacionAsesorDTO> getResumenInvestigacion(
			String idAsesor) {
		Query query = entityManager
				.createQuery("SELECT new co.edu.uniquindio.ondas.dtos.ResumenInvestigacionAsesorDTO(investigacion.identificacion, investigacion.grupo.identificacion, investigacion.grupo.nombre, investigacion.grupo.sede.nombre) FROM Asesor asesor INNER JOIN asesor.investigaciones investigacion WHERE asesor.identificacion=:parametro");
		query.setParameter("parametro", idAsesor);
		return query.getResultList();
	}
	
	/**
	 * Metodo que permite obtener una lista de Asesores poer Linea Tematica dado en el identificador de la linea
	 * @param idLinea
	 * @return Lista de Asesores
	 */
	@SuppressWarnings("unchecked")
	public List<Asesor> obtenerAsesoresLinea(long idLinea)
	{
		Query query=entityManager.createQuery("SELECT a FROM Asesor a WHERE a.lineaTematica.identificacion=:parametro");
		query.setParameter("parametro", idLinea);
		return query.getResultList();
	}
	
	/**
	 * Metodo que permite consultar y obtener una lista de Asesores que tienen asisgnados una Investigacion
	 * @return Listado de Asesores con Investigacion Asignada
	 */
	@SuppressWarnings("unchecked")
	public List<Asesor> obtenerAsesoresConInvestigaciones()
	{
		Query query=entityManager.createQuery("SELECT a FROM Asesor a,IN(a.investigaciones) i WHERE i IS NOT NULL AND i IS NOT EMPTY ORDER BY a.nombre, a.lineaTematica.linea");
		return query.getResultList();
	}

}
